using System.Collections.Generic;
using System.Threading.Tasks;
using JGSY.CMS.LowCode.Platform.Domain.Entities;

namespace JGSY.CMS.LowCode.Platform.Domain.Interfaces
{
    /// <summary>
    /// 媒体文件仓储接口
    /// 提供媒体文件数据访问操作，支持文件管理和存储控制
    /// </summary>
    public interface IMediaFileRepository
    {
        /// <summary>
        /// 获取所有媒体文件记录
        /// </summary>
        /// <returns>媒体文件实体列表</returns>
        Task<IEnumerable<MediaFile>> GetAllAsync();
        
        /// <summary>
        /// 根据ID获取媒体文件记录
        /// </summary>
        /// <param name="id">媒体文件标识符</param>
        /// <returns>媒体文件实体，如果未找到则返回null</returns>
        Task<MediaFile?> GetByIdAsync(long id);

        /// <summary>
        /// 根据文件路径获取媒体文件记录
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns>媒体文件实体，如果未找到则返回null</returns>
        Task<MediaFile?> GetByFilePathAsync(string filePath);

        /// <summary>
        /// 根据哈希值获取媒体文件记录
        /// </summary>
        /// <param name="hash">哈希值</param>
        /// <returns>媒体文件实体，如果未找到则返回null</returns>
        Task<MediaFile?> GetByHashAsync(string hash);

        /// <summary>
        /// 根据分类获取媒体文件
        /// </summary>
        /// <param name="category">文件分类</param>
        /// <returns>媒体文件列表</returns>
        Task<IEnumerable<MediaFile>> GetByCategoryAsync(string category);

        /// <summary>
        /// 根据文件类型获取媒体文件
        /// </summary>
        /// <param name="fileType">文件类型</param>
        /// <returns>媒体文件列表</returns>
        Task<IEnumerable<MediaFile>> GetByFileTypeAsync(string fileType);

        /// <summary>
        /// 分页获取媒体文件列表
        /// </summary>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">页大小</param>
        /// <param name="keyword">搜索关键词</param>
        /// <param name="category">文件分类</param>
        /// <param name="fileType">文件类型</param>
        /// <param name="status">状态过滤</param>
        /// <returns>分页结果</returns>
        Task<(IEnumerable<MediaFile> Items, int TotalCount)> GetPagedAsync(
            int pageIndex, 
            int pageSize, 
            string? keyword = null, 
            string? category = null,
            string? fileType = null,
            byte? status = null);
        
        /// <summary>
        /// 添加新媒体文件
        /// </summary>
        /// <param name="entity">要添加的媒体文件实体</param>
        /// <returns>添加操作任务</returns>
        Task AddAsync(MediaFile entity);
        
        /// <summary>
        /// 更新媒体文件信息
        /// </summary>
        /// <param name="entity">更新后的媒体文件实体</param>
        /// <returns>更新操作任务</returns>
        Task UpdateAsync(MediaFile entity);
        
        /// <summary>
        /// 删除媒体文件
        /// </summary>
        /// <param name="id">媒体文件标识符</param>
        /// <returns>删除操作任务</returns>
        Task DeleteAsync(long id);

        /// <summary>
        /// 批量删除媒体文件
        /// </summary>
        /// <param name="ids">媒体文件ID列表</param>
        /// <returns>删除数量</returns>
        Task<int> BatchDeleteAsync(IEnumerable<long> ids);

        /// <summary>
        /// 增加下载次数
        /// </summary>
        /// <param name="id">媒体文件ID</param>
        /// <returns>是否更新成功</returns>
        Task<bool> IncrementDownloadCountAsync(long id);

        /// <summary>
        /// 搜索媒体文件
        /// </summary>
        /// <param name="keyword">搜索关键词</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="pageSize">页大小</param>
        /// <returns>搜索结果</returns>
        Task<(IEnumerable<MediaFile> Items, int TotalCount)> SearchAsync(
            string keyword, 
            int pageIndex = 1, 
            int pageSize = 20);

        /// <summary>
        /// 获取存储统计信息
        /// </summary>
        /// <returns>存储统计信息</returns>
        Task<object> GetStorageStatisticsAsync();

        /// <summary>
        /// 清理未使用的文件
        /// </summary>
        /// <returns>清理的文件数量</returns>
        Task<int> CleanupUnusedFilesAsync();

        /// <summary>
        /// 获取未使用的媒体文件
        /// </summary>
        /// <param name="daysOld">天数阈值</param>
        /// <returns>未使用的媒体文件列表</returns>
        Task<IEnumerable<MediaFile>> GetUnusedFilesAsync(int daysOld = 30);
    }
}
